struct game {
	int id;
	char name[32];
	char play; // 0 - Никого (Можно создать игру). 1 - Один игрок (Ждет подключения). 2 - Два игрока (Полная).
	char checkers[8][8];
	int countchecks[2];
	int num_move;
	struct client *black, *white;
} *games;

/*
int send_move(char move[9]);	- функция проверки корректности хода на корректность. Пересылает исключительно цифры.
Например если пришло сообщение вида 4365, это можно расшифровать как "D6-F4"
Иначе говоря здесь БукваЦифра. Буквы по нарастающей (А=1..H=8), Цифры наоборот (1=8..8=1)) 

move[9]:
	move[1]move[0]	- координата начала
	move[3]move[2]	- координата конца
	move[5]move[4]	- координата срубленной пешки
	move[6] - состояние первой координаты
	move[7] - состояние второй координаты
	move[8] - состояние третьей координаты

*/

/* A  B  C  D  E  F  G  H	j>
1
2
3
4
5
6
7
8
i

*/

//int num_move=1, this_game->countchecks[2]={12, 12};
//int temp_x=0, temp_y=0;		// чтобы пользователь не мухлевал с повторным рубом

//===============================Перебор возможных рубных комбинаций для пешки=====================
int plank_for_pawn(char checkers[8][8], int you, int no_you, int i, int j)
{
				if ( ( (i-1>0) && (j-1>0) ) && ( (i-2>=0) && (j-2>=0) ) )	//7
					if ( (checkers[i][j]==you) && ( ( checkers[i-1][j-1]==no_you) || (checkers[i-1][j-1]==no_you*2) ) && ( checkers[i-2][j-2]==0) )
						{
						return 5;
						}


				if ( ( (i+1<8) && (j+1<8) ) && ( (i+2<8) && (j+2<8) ) )	//3
					if ( (checkers[i][j]==you) && ( (checkers[i+1][j+1]==no_you) || (checkers[i+1][j+1]==no_you*2 ) ) && (checkers[i+2][j+2]==0) )
						{
						return 5;
						}

				if ( ( (i-1>=0) && (j+1<8) ) && ( (i-2>=0) && (j+2<8) ) )	//9
					if ( (checkers[i][j]==you) && ( (checkers[i-1][j+1]==no_you) || (checkers[i-1][j+1]==no_you*2) ) && (checkers[i-2][j+2]==0) )
						{
						return 5;
						}

				if ( ( (i+1<8) && (j-1>=0) ) && ( (i+2<8) && (j-2>=0) ) )	//1
					if ( (checkers[i][j]==you) && ( (checkers[i+1][j-1]==no_you) || (checkers[i+1][j-1]==no_you*2) ) && (checkers[i+2][j-2]==0) )
						{
						return 5;
						}
return 0;
}


// Проверка на "сортир". Основная идея - если есть хотябы 1 ход, значит не сортира, иначе you have big problem
int shithouse(char checkers[8][8], int you, int no_you)
{
int i, j;
	for (i=0; i<8; i++){
		if ( (i%2)==0 ) j=1;
		else j=0;
		for (; j<8; j+=2){
			if (checkers[i][j]==you){


			// предположим что единственный несортирный путь - ходить
				if (you == 1){

					if ( (i+1<8) && (j+1<8) )	//3
						if ( (checkers[i][j]==you) && (checkers[i+1][j+1]==0) )
							{
							return 0;	// Ну или переход здесь како-то надо
							}

					if ( (i+1<8) && (j-1>=0) )	//1
						if ( (checkers[i][j]==you) && (checkers[i+1][j-1]==0) )
							{
							return 0;	// Ну или переход здесь како-то надо
							}	
				}

				
				if (you == -1){
				
					if ( (i-1>0) && (j-1>0) )	//7
						if ( (checkers[i][j]==you) && ( checkers[i-1][j-1]==0) )
							{
							return 0;	// Ну или переход здесь како-то надо
							}

					if ( (i-1>=0) && (j+1<8) )	//9
						if ( (checkers[i][j]==you) && (checkers[i-1][j+1]==0) )
							{
							return 0;	// Ну или переход здесь како-то надо
							}
				}
				if (plank_for_pawn(checkers, you, no_you, i, j)==5)
					return 5;
						
		}
	}
}
return 1;
}


/*
Проверка на повторное рубилово у пешек
Смысл: ищем хотябы одну пешку, которая может рубить
*/
int repeat_eat(char checkers[8][8], int you, int no_you)
{
int i, j;

	for (i=0; i<8; i++){
		if ( (i%2)==0 ) j=1;
		else j=0;
		
		for (; j<8; j+=2){

		if (plank_for_pawn(checkers, you, no_you, i, j)==5)
			return 5;

		}
	}
	return 0;
}

/*
Проверка на повторное рубилово у дамок
НЕДОДЕЛАНО!!!! Работает, но абсолютно неверно. Код законсервирован до лучших времен
Смысл: ищем хотябы одну пешку, которая может рубить
*/
int repeat_eat_for_king(char checkers[8][8], int you, int no_you, int move[6])
{


int num_empty, ki, kj, l, i, j, n;
num_empty = abs(move[3] - move[5]);

/*		НЕРАБОТАЮЩЕЕ *****! Переделать
		if (move[3]>move[5]) ki=-1;
		else ki=1;
		if (move[2]>move[4]) kj=-1;
		else kj=1;
		
		for (i=1, j=1; i<=num_empty; i++, j++)
			if ((this_game->checkers[move[5]+i*ki-1][move[4]+j*kj-1]) == 0){
				if (ki==-1){
					n=0;
					for (l=1; ((move[5]+i*ki-l)>=0) && ((move[4]+j*kj-l)>=0)	;l++){
						if (this_game->checkers[move[5]+i*ki-l][move[4]+j*kj-l]==0)
							n++;
					if (n==l-1)
						mvprintw (22, 4, "WARNING");
					}

					n=0;
					for (l=1; ((move[5]+i*ki+l)<=8) && ((move[4]+j*kj+l)<=8) ;l++ ) {
						if (this_game->checkers[move[5]+i*ki+l][move[4]+j*kj+l]==0)
							n++;
					if (n==l-1)
						mvprintw (22, 4, "WARNING2");
					}
				}
			
			}
*/
			/*
				n++;
			else {
				move[4] = move[1]+i*ki;
				move[5] = move[0]+j*kj;
			}
			*/
/*
		if (n==num_empty-2) {	// King must Eat
			
				this_game->checkers[move[1]-1][move[0]-1]=0;
				this_game->checkers[move[4]-1][move[5]-1]=0;
				this_game->checkers[move[3]-1][move[2]-1]=you * 2;
				
				cod_exit = 21;

				if (you==1) no_you=1;
				if (you==-1) no_you=0;
				this_game->countchecks[no_you]--;

				next_gamer=1;
		}
*/

return 0;
}

/*
Какое-либо подробное описание представлено в начале файла
*/
int send_move(int move[9], struct game *this_game)
{
/*
	mvprintw(23, 1, "%d", move[0]);
	mvprintw(23, 2, "%d", move[1]);
	mvprintw(23, 3, "%d", move[2]);
	mvprintw(23, 4, "%d", move[3]);
*/
//this_game->num_move =1;

int no_you, you, next_gamer=0;	 
move[8]=7;
move[6]=this_game->checkers[move[1]-1][move[0]-1];
move[7]=this_game->checkers[move[3]-1][move[2]-1];
move[4]=move[5]=0;

/*
you - кто ходит. 1 - беляк, -1 - афро
no_you - врагЪ (противоположный you)
next_gamer - следующий игрок делает соперник?
*/



if ( ( (this_game->num_move)%2 ) == 1) {you=1;no_you=-1;}
else {no_you=1;you=-1;}


	if ( (fabs(move[0]-move[2])==1) && (fabs(move[1]-move[3])==1) ){	// i like to MOVE IT MOVE IT

		if ((this_game->checkers[move[1]-1][move[0]-1]==you) && (this_game->checkers[move[3]-1][move[2]-1]==0)){
			if ( ((you==1) && (move[1]<move[3])) || ((you==-1) && (move[1]>move[3])) ){
			
				if (repeat_eat(this_game->checkers, you, no_you)==5){
					return 0;
				}
				
				move[6]=this_game->checkers[move[1]-1][move[0]-1]=0;
				move[7]=this_game->checkers[move[3]-1][move[2]-1]=you;

				next_gamer=1;
			}
		}
			
	}
	else{
		// FOOOOOOOOOO00000000D
			if ( (this_game->checkers[move[1]-1][move[0]-1]==you) && ((this_game->checkers[(move[3]+move[1])/2-1][(move[2]+move[0])/2-1]==no_you) || (this_game->checkers[(move[3]+move[1])/2-1][(move[2]+move[0])/2-1]==no_you*2)) && (this_game->checkers[move[3]-1][move[2]-1]==0) && (fabs(move[1]-move[3])==2) ) {

				
				move[5]=(move[3]+move[1])/2;
				move[4]=(move[2]+move[0])/2;
			
				move[6]=this_game->checkers[move[1]-1][move[0]-1]=0;
				move[8]=this_game->checkers[move[5]-1][move[4]-1]=0;
				move[7]=this_game->checkers[move[3]-1][move[2]-1]=you;

				if (you==1) this_game->countchecks[1]--;
				if (you==-1) this_game->countchecks[0]--;

				next_gamer=1;
				
				if (plank_for_pawn(this_game->checkers, you, no_you, move[3]-1, move[2]-1)==5)
					next_gamer=0;

			}
	}
	
	if (you == 1){
		if ( (move[3]==8) && (move[7]==1) ) // Upgrade to King of Kings	
			move[7]=this_game->checkers[move[3]-1][move[2]-1]=2;
	}
	else{ 
		if ( (move[3]==1) && (move[7]==-1) ) // Upgrade to King of Kings
			move[7]=this_game->checkers[move[3]-1][move[2]-1]=-2;
	}

int num_empty, i, j, ki, kj, n=0;
/*
num_empty - общее количество клеток, на которые должна походить дамка
n - количество пустых клеток из num_empty
ki, kj - коэффициены умножения. Нужны для отслеживания координат, где дамка должна походить
must_die - координата клетки, где стоит шашка, которую съест дамка
*/


/*
Ходит дамка. Основная идея - по указанной диагонали происходит проверка - если там все пустое, значит это ход. Если 1 занятая врадиной клетка - сруб. Если черти что - вперемешку свои, враг и т.д. то ничего не произойдет
*/
	if ( (this_game->checkers[move[1]-1][move[0]-1] == you*2) && (this_game->checkers[move[3]-1][move[2]-1]==0) && (abs(move[1]-move[3])==abs(move[0]-move[2])) ) {	// This is King
	
		num_empty = abs(move[1]-move[3]);
		if (move[1]>move[3]) ki=-1;
		else ki=1;
		if (move[0]>move[2]) kj=-1;
		else kj=1;
		
		for (i=1, j=1; i<num_empty; i++, j++)
			if ((this_game->checkers[move[1]+i*ki-1][move[0]+j*kj-1]) == 0)
				n++;
			else {
				move[5] = move[1]+i*ki;
				move[4] = move[0]+j*kj;
			}

		if (n==num_empty-1) {	// MoveKing
		
				move[6]=this_game->checkers[move[1]-1][move[0]-1]=0;
				move[7]=this_game->checkers[move[3]-1][move[2]-1]=you * 2;
				
				next_gamer=1;
		}

		if ((n==num_empty-2) && ((this_game->checkers[move[5]-1][move[4]-1]==no_you) || (this_game->checkers[move[5]-1][move[4]-1]==no_you*2)) ) {	// King must Eat
				//repeat_eat_for_king(this_game->checkers, you, no_you, move);
				
				move[6]=this_game->checkers[move[1]-1][move[0]-1]=0;
				move[8]=this_game->checkers[move[5]-1][move[4]-1]=0;
				move[7]=this_game->checkers[move[3]-1][move[2]-1]=you * 2;
				
				if (you==1) no_you=1;
				if (you==-1) no_you=0;
				this_game->countchecks[no_you]--;

				next_gamer=1;
		}		
	}


if (this_game->countchecks[0]==0){
	move[8]=9;
	move[5]=1;
	move[4]=0;
	next_gamer=0;
	}
	
if (this_game->countchecks[1]==0){
	move[8]=9;
	move[5]=-1;
	move[4]=0;
	next_gamer=0;
	}




if (next_gamer==1){
	// проверяем вначале для первого игрока (он может сам случайно в сортир зайти)
	if (shithouse(this_game->checkers, 1, -1)==1){
			if (you==1)
				{
				move[8]=9;
				move[5]=-1;
				move[4]=0;
				}
			else
				{
				move[8]=9;
				move[5]=1;
				move[4]=0;
				}
		}

	if (shithouse(this_game->checkers, -1, 1)==1){
			if (you==1)
				{
				move[8]=9;
				move[5]=1;
				move[4]=0;
				}
			else
				{
				move[8]=8;
				move[5]=-1;
				move[4]=0;
				}

		}	
	this_game->num_move++;
}

return 0;
}
/*
На завтра

2. Разобраться с повторным рубиловом у дамок
*/


/*
Перенести информацию о выигрыше/проигрыше в интерфейс

1. Значит, говоришь, что массив ch_all (количество пешек белых и черных) передавать туда-сюда нерационально и неправильно - значит, говоришь, его после каждого хода пересчитывать. Лады - будет сделано, но, исключительно интересно - с точки зрения плохого программирования - это ведь хуже чем передавать значение туда-сюда, да?


3. Протестировать защиту от читерского руба (вначале дореализовать ее)

*/

